一早就知道有mysql有外键这回事,但是貌似平时的项目中用到的并不多,以至于我没有去研究过这个东西,也不知道该怎么用。当然也不清楚对性能的影响。这篇文章先搞清楚外键的作用。
首先来添加一张表,做为测试要用的一张参考表。
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`sex` tinyint(4) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
接着建一张包含外键的表。
CREATE TABLE `user_article` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`content` varchar(255) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`modify_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
CONSTRAINT `user_article_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
接着就测试一下外键的作用。分别在user表和user_article表创建一点数据。
user表
id | name | sex | create_time |
---|---|---|---|
1 | admin | 1 | 2016-09-08 16:36:55 |
2 | xiaoming | 2 | 2016-09-08 16:37:07 |
user_article表
id | user_id | content | create_time | modify_time |
---|---|---|---|---|
1 | 1 | hello word | 2016-09-08 16:39:11 | NULL |
现在目的是要保持user表和user_article表的数据完整性,所以在删除user的时候,如果user_article存在数据的话,那么禁止删除。user表和user_article表是通过user_id关联的。在建表的时候就已经为user_article表的user_id字段建立了外键,参考栏位就是user表的id,更新和删除时选项都为 RESTRICT。
现在我运行删除语句 delete from user where id=1;
会报如下错误:
Cannot delete or update a parent row: a foreign key constraint fails (`test`.`user_article`, CONSTRAINT `user_article_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`))
因为在user_article中存在user_id为1的数据,所以这里禁止参考表删除这条数据。
更新和删除时的选项可以根据自己的实际情况进行修改,下面是更新和修改时的触发机制:
on delete和on update , 可设参数:
cascade(跟随外键改动)
restrict(限制外表中的外键改动)
set Null(设空值)
set Default(设默认值)
no action [默认]
具体的使用还需要自己多测试多使用就能理解了,其实外键也不难搞懂,只是接触的少了。平时的代码中实现这一类逻辑基本是用代码去实现的,所以一般不会用到外键。那么外键的优势和劣势在哪里,这个估计要亲身体验才能知道了吧,
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。